#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
自动安装并启动电视应用的脚本
功能：使用ADB命令将应用安装到电视设备上并启动，直到成功为止
"""

import os
import sys
import time
import subprocess
import re
import platform

# 检测操作系统类型
IS_WINDOWS = platform.system() == "Windows"
IS_MACOS = platform.system() == "Darwin"
IS_LINUX = platform.system() == "Linux"

# 配置参数
APP_PACKAGE_NAME = "com.tvapp"
APP_ACTIVITY_NAME = "com.tvapp.MainActivity"
APK_FILE_PATH = "app/build/outputs/apk/debug/app-debug.apk"  # APK构建输出路径
MAX_RETRIES = 10  # 最大重试次数
RETRY_INTERVAL = 5  # 重试间隔（秒）


def run_command(command, timeout=30):
    """运行命令并返回输出和退出码"""
    try:
        print(f"执行命令: {' '.join(command)}")
        result = subprocess.run(
            command,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True,
            timeout=timeout
        )
        return result.stdout.strip(), result.stderr.strip(), result.returncode
    except subprocess.TimeoutExpired:
        return "", "命令执行超时", -1
    except FileNotFoundError:
        # 特别处理ADB命令未找到的情况
        if command and command[0] == "adb":
            return "", "ADB命令未找到，请确保Android SDK Platform Tools已安装并添加到系统路径", -3
        return "", f"命令未找到: {command[0]}", -2
    except Exception as e:
        return "", f"命令执行出错: {str(e)}", -2


def check_and_guide_adb_installation():
    """检查ADB是否安装，并提供详细的安装指导"""
    print("\n=== ADB安装检查 ===")
    
    # 检查ADB命令是否可用
    try:
        subprocess.run(["adb", "version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=5)
        print("✅ ADB已正确安装")
        return True
    except FileNotFoundError:
        print("❌ ADB未安装或未添加到系统路径")
        
        # 提供不同操作系统的安装指导
        print("\n📋 ADB安装指南:")
        print("====================")
        
        if IS_WINDOWS:
            print("Windows系统安装步骤:")
            print("1. 下载Android SDK Platform Tools: https://developer.android.com/studio/releases/platform-tools")
            print("2. 解压下载的zip文件到任意位置，例如: C:\\platform-tools\\")
            print("3. 将platform-tools目录添加到系统环境变量PATH中:")
            print("   - 右键点击\"此电脑\" > 属性 > 高级系统设置 > 环境变量")
            print("   - 选择\"系统变量\"中的\"Path\" > 编辑 > 新建")
            print("   - 输入: C:\\platform-tools\\ (根据您的实际解压路径)")
            print("   - 点击确定保存所有更改")
            print("4. 重启命令提示符或PowerShell后重试")
        elif IS_MACOS:
            print("macOS系统安装步骤:")
            print("方法1 (使用Homebrew):")
            print("  - 打开终端并运行: brew install --cask android-platform-tools")
            print("方法2 (手动安装):")
            print("  1. 下载Android SDK Platform Tools: https://developer.android.com/studio/releases/platform-tools")
            print("  2. 解压下载的zip文件")
            print("  3. 打开终端，运行: sudo mv ~/Downloads/platform-tools /usr/local/")
            print("  4. 运行: echo 'export PATH=$PATH:/usr/local/platform-tools' >> ~/.bash_profile")
            print("  5. 运行: source ~/.bash_profile")
        elif IS_LINUX:
            print("Linux系统安装步骤:")
            print("方法1 (使用包管理器):")
            print("  - Ubuntu/Debian: sudo apt update && sudo apt install android-tools-adb")
            print("  - Fedora: sudo dnf install android-tools")
            print("  - Arch Linux: sudo pacman -S android-tools")
            print("方法2 (手动安装):")
            print("  1. 下载Android SDK Platform Tools: https://developer.android.com/studio/releases/platform-tools")
            print("  2. 解压: unzip platform-tools-latest-linux.zip")
            print("  3. 移动: sudo mv platform-tools /usr/local/")
            print("  4. 添加到PATH: echo 'export PATH=$PATH:/usr/local/platform-tools' >> ~/.bashrc")
            print("  5. 应用更改: source ~/.bashrc")
        else:
            print("请参考官方文档安装Android SDK Platform Tools: https://developer.android.com/studio/releases/platform-tools")
        
        print("\n🔗 官方下载链接: https://developer.android.com/studio/releases/platform-tools")
        print("====================")
        return False
    except Exception as e:
        print(f"检查ADB时出错: {str(e)}")
        return False

def check_adb_connection():
    """检查ADB连接状态"""
    # 首先检查ADB是否安装
    if not check_and_guide_adb_installation():
        return False
    
    print("\n=== 检查ADB连接 ===")
    output, error, return_code = run_command(["adb", "devices"])
    
    if return_code != 0:
        print(f"错误: ADB命令执行失败 - {error}")
        print("请确保ADB已正确安装并添加到系统路径中")
        return False
    
    # 检查是否有设备连接
    devices = output.splitlines()[1:]  # 跳过标题行
    devices = [line.strip() for line in devices if line.strip()]
    
    if not devices:
        print("错误: 未检测到连接的设备")
        print("请确保电视已通过USB或网络连接，并启用了USB调试模式")
        print("\n📱 连接电视设备指南:")
        print("1. USB连接:")
        print("   - 使用USB数据线连接电脑和电视")
        print("   - 在电视上启用开发者选项和USB调试")
        print("2. 网络连接 (推荐):")
        print(f"   - 确保电脑和电视在同一网络")
        print(f"   - 在电视上启用开发者选项和USB调试")
        print(f"   - 电视IP地址: 192.168.1.11")
        print(f"   - 运行命令: adb connect 192.168.1.11")
        return False
    
    for device in devices:
        if "device" in device:
            device_id = device.split()[0]
            print(f"成功: 检测到已连接的设备 - {device_id}")
            return True
        elif "unauthorized" in device:
            device_id = device.split()[0]
            print(f"警告: 设备 {device_id} 未授权，请在设备上允许USB调试")
        elif "offline" in device:
            device_id = device.split()[0]
            print(f"警告: 设备 {device_id} 处于离线状态")
    
    print("错误: 没有可用的已连接设备")
    print("请在设备上检查USB调试授权提示")
    return False


def build_apk():
    """构建APK文件"""
    print("\n=== 构建APK ===")
    
    # 检查是否存在gradlew或gradle
    if os.path.exists("./gradlew"):
        gradle_command = ["./gradlew", "assembleDebug"]
    elif os.path.exists("gradlew.bat"):
        gradle_command = ["gradlew.bat", "assembleDebug"]
    else:
        gradle_command = ["gradle", "assembleDebug"]
    
    # 运行构建命令
    print(f"正在构建应用，请稍候...")
    output, error, return_code = run_command(gradle_command, timeout=300)  # 给构建更多时间
    
    if return_code != 0:
        print(f"错误: APK构建失败")
        print(f"构建错误: {error}")
        return False
    
    # 检查APK文件是否生成
    if not os.path.exists(APK_FILE_PATH):
        print(f"错误: 构建完成但未找到APK文件: {APK_FILE_PATH}")
        print("请检查构建输出路径是否正确")
        return False
    
    print(f"成功: APK构建完成，文件位置: {APK_FILE_PATH}")
    return True


def install_app():
    """安装应用到设备"""
    print("\n=== 安装应用 ===")
    
    # 先尝试卸载应用（如果已存在）
    print("检查应用是否已安装...")
    _, _, return_code = run_command(["adb", "shell", f"pm list packages | grep {APP_PACKAGE_NAME}"])
    
    if return_code == 0:
        print("应用已安装，正在卸载...")
        _, error, return_code = run_command(["adb", "uninstall", APP_PACKAGE_NAME])
        if return_code != 0:
            print(f"警告: 卸载应用失败: {error}")
            print("将尝试直接安装...")
    
    # 安装应用
    print("正在安装应用，请稍候...")
    output, error, return_code = run_command(["adb", "install", APK_FILE_PATH], timeout=120)
    
    if return_code != 0:
        print(f"错误: 应用安装失败")
        print(f"安装错误: {error}")
        return False
    
    if "Success" in output:
        print("成功: 应用安装完成")
        return True
    else:
        print(f"错误: 安装过程出现问题: {output}")
        return False


def launch_app():
    """启动应用"""
    print("\n=== 启动应用 ===")
    
    # 启动应用
    launch_command = [
        "adb", "shell", 
        f"am start -n {APP_PACKAGE_NAME}/{APP_ACTIVITY_NAME}"
    ]
    
    output, error, return_code = run_command(launch_command)
    
    if return_code != 0:
        print(f"错误: 应用启动失败")
        print(f"启动错误: {error}")
        return False
    
    if "Error" in output or "error" in output:
        print(f"错误: 启动过程出现问题: {output}")
        return False
    
    print("成功: 应用启动完成")
    return True


def wait_for_device_ready():
    """等待设备就绪"""
    print("\n=== 等待设备就绪 ===")
    max_wait = 30  # 最大等待时间（秒）
    start_time = time.time()
    
    while time.time() - start_time < max_wait:
        output, _, _ = run_command(["adb", "shell", "getprop sys.boot_completed"])
        if output == "1":
            print("设备已就绪")
            return True
        print("等待设备就绪...")
        time.sleep(2)
    
    print("警告: 设备未完全就绪，但将继续尝试")
    return False


def main():
    """主函数"""
    print("========== 电视应用安装启动脚本 ==========")
    print(f"目标包名: {APP_PACKAGE_NAME}")
    print(f"目标Activity: {APP_ACTIVITY_NAME}")
    print("======================================")
    
    retry_count = 0
    success = False
    
    # 预定义电视IP地址
    TV_IP_ADDRESS = "192.168.1.11"
    
    while retry_count < MAX_RETRIES and not success:
        if retry_count > 0:
            print(f"\n=== 第 {retry_count + 1} 次重试 ===")
            print(f"等待 {RETRY_INTERVAL} 秒后重试...")
            time.sleep(RETRY_INTERVAL)
        
        # 1. 检查ADB连接
        if not check_adb_connection():
            # 如果ADB已安装但没有连接设备，尝试直接连接到电视IP
            if check_and_guide_adb_installation():
                print(f"\n📡 尝试直接连接到电视设备: {TV_IP_ADDRESS}")
                print(f"执行命令: adb connect {TV_IP_ADDRESS}")
                try:
                    subprocess.run(["adb", "connect", TV_IP_ADDRESS], timeout=10)
                    print(f"已尝试连接到 {TV_IP_ADDRESS}，请在电视上确认调试授权")
                    time.sleep(3)  # 给用户时间在电视上确认
                    # 再次检查连接
                    if check_adb_connection():
                        print("✅ 成功连接到电视设备")
                    else:
                        print("❌ 连接失败，请手动在电视上启用USB调试并接受授权")
                except Exception as e:
                    print(f"连接设备时出错: {str(e)}")
            
            retry_count += 1
            continue
        
        # 2. 等待设备就绪
        wait_for_device_ready()
        
        # 3. 构建APK
        if not build_apk():
            retry_count += 1
            continue
        
        # 4. 安装应用
        if not install_app():
            retry_count += 1
            continue
        
        # 5. 启动应用
        if launch_app():
            success = True
        else:
            retry_count += 1
    
    if success:
        print("\n======================================")
        print("🎉 成功: 应用已成功安装并启动！")
        print("======================================")
        return 0
    else:
        print("\n======================================")
        print(f"❌ 失败: 达到最大重试次数 ({MAX_RETRIES})")
        print("请检查以下事项:")
        print("1. ADB是否正确安装并添加到系统路径")
        print("2. 设备是否正确连接 (USB或网络)")
        print("3. USB调试是否已启用并授权")
        print("4. 设备存储空间是否充足")
        print("5. 应用签名是否与已安装版本兼容")
        print(f"6. 电视IP地址是否正确: {TV_IP_ADDRESS}")
        print("\n📋 手动连接步骤:")
        print(f"1. 确保电视已开启开发者选项和USB调试")
        print(f"2. 运行命令: adb connect {TV_IP_ADDRESS}")
        print(f"3. 在电视上接受调试授权")
        print(f"4. 确认连接: adb devices")
        print(f"5. 手动安装: adb install {APK_FILE_PATH}")
        print(f"6. 手动启动: adb shell am start -n {APP_PACKAGE_NAME}/{APP_ACTIVITY_NAME}")
        print("======================================")
        return 1


if __name__ == "__main__":
    sys.exit(main())